package designPattern;

/**
 * 懒汉式(双重检查加锁版本)
 * */
public class SingletonBySync {

    //volatile防止指令重排序，new SingletonBySync();有可能是先赋值给引用，再初始化，导致第二个线程拿到未初始化完成的对象
    private volatile static SingletonBySync uniqueInstance;

    private SingletonBySync() {
    }

    public static SingletonBySync getInstance() {
        //检查实例，如果不存在，就进入同步代码块
        if (uniqueInstance == null) {
            //只有第一次才彻底执行这里的代码
            synchronized (SingletonBySync.class) {
                //进入同步代码块后，再检查一次，如果仍是null，才创建实例
                if (uniqueInstance == null) {
                    uniqueInstance = new SingletonBySync();
                }
            }
        }
        return uniqueInstance;
    }
}
